Apache Impala একটি উচ্চ-পারফরম্যান্স SQL ইঞ্জিন, যা Hadoop পরিবেশে দ্রুত ডেটা প্রসেসিং এবং বিশ্লেষণ করার জন্য ব্যবহৃত হয়। Impala-তে Data Aggregation এবং Window Functions হল দুটি গুরুত্বপূর্ণ কৌশল, যা ডেটা বিশ্লেষণের জন্য অত্যন্ত কার্যকরী। এই দুটি কৌশল ব্যবহার করে আপনি ডেটার বিভিন্ন সংক্ষিপ্ত ও বিশ্লেষণমূলক রূপ তৈরি করতে পারেন।
Data Aggregation
Data Aggregation হল এমন একটি প্রক্রিয়া যার মাধ্যমে ডেটার উপর বিভিন্ন গাণিতিক অপারেশন চালিয়ে (যেমন মোট, গড়, গণনা) উপসংহার তৈরি করা হয়। Impala-তে Aggregation Functions ব্যবহার করে ডেটার উপর বিভিন্ন প্রকারের বিশ্লেষণ করা যায়।
Aggregation Functions এর ধরন
- COUNT(): একটি কলামে কতগুলো রেকর্ড রয়েছে তা গণনা করে।
- SUM(): একটি কলামের মোট মান হিসাব করে।
- AVG(): একটি কলামের গড় মান হিসাব করে।
- MIN(): একটি কলামের সর্বনিম্ন মান হিসাব করে।
- MAX(): একটি কলামের সর্বোচ্চ মান হিসাব করে।
Aggregation Example
ধরা যাক আমাদের একটি sales টেবিল রয়েছে যেখানে amount এবং sale_date কলাম রয়েছে, এবং আমরা total sales, average sales, min sales, এবং max sales গণনা করতে চাই।
SELECT
COUNT(*) AS total_sales,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount,
MIN(amount) AS min_amount,
MAX(amount) AS max_amount
FROM sales;
এই কুয়েরিটি sales টেবিলের উপর Aggregation অপারেশন পরিচালনা করবে এবং বিভিন্ন পরিসংখ্যান দেখাবে, যেমন মোট বিক্রয়, গড় বিক্রয়, সর্বনিম্ন বিক্রয়, এবং সর্বোচ্চ বিক্রয়।
Window Functions
Window Functions হল এমন একটি SQL ফিচার যা আপনাকে রেকর্ডের উপর গাণিতিক অপারেশন চালাতে সাহায্য করে, কিন্তু এটি ডেটার মোট সংখ্যা পরিবর্তন না করে (যেমন একটি গ্রুপ বা উইন্ডোতে)। এই ফাংশনগুলি সাধারণত OVER() ক্লজের মাধ্যমে ব্যবহৃত হয়।
Window Functions এর ধরন
- ROW_NUMBER(): একটি উইন্ডোতে রেকর্ডের জন্য ইউনিক নম্বর প্রদান করে।
- RANK(): উইন্ডোতে রেকর্ডের র্যাঙ্ক প্রদান করে, তবে যদি দুটি রেকর্ডের একই মান থাকে, তাহলে তাদের সমান র্যাঙ্ক প্রদান করা হয়।
- DENSE_RANK(): RANK() এর মতো, তবে একাধিক রেকর্ডের জন্য একই র্যাঙ্ক দেওয়ার পরেও পরবর্তী র্যাঙ্কের সংখ্যা পরিবর্তিত হয় না।
- NTILE(n): রেকর্ডগুলোকে সমান ভাগে ভাগ করে, এবং প্রতিটি ভাগের জন্য একটি নির্দিষ্ট নাম্বার (n) প্রদান করে।
- SUM(), AVG(), MIN(), MAX(): এই গাণিতিক ফাংশনগুলো উইন্ডো ফাংশনের মধ্যে ব্যবহার করা যেতে পারে।
Window Function Example
ধরা যাক আমাদের একটি employees টেবিল রয়েছে, যেখানে employee_id, name, এবং salary কলাম রয়েছে, এবং আমরা প্রত্যেক কর্মচারীর জন্য তাদের বেতন অনুযায়ী র্যাঙ্কিং (Rank) নির্ধারণ করতে চাই।
SELECT
employee_id,
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
এই কুয়েরি employees টেবিলের সকল কর্মচারীর বেতন অনুযায়ী একটি র্যাঙ্ক তৈরি করবে, যেখানে সর্বোচ্চ বেতনের কর্মচারীকে প্রথম র্যাঙ্ক দেওয়া হবে।
Data Aggregation এবং Window Functions এর মধ্যে পার্থক্য
| ফিচার | Data Aggregation | Window Functions |
|---|---|---|
| ফাংশন | COUNT(), SUM(), AVG(), MIN(), MAX() | ROW_NUMBER(), RANK(), DENSE_RANK(), SUM(), AVG() |
| কাজ করার পদ্ধতি | গ্রুপ করে ফলাফল প্রদান করা হয় | গ্রুপ না করে রেকর্ডের মধ্যে গাণিতিক অপারেশন করা হয় |
| ফলাফল | একটি একক সারির আউটপুট | একাধিক সারির মধ্যে আউটপুট প্রদান করা হয়, কিন্তু মোট রেকর্ড সংখ্যা পরিবর্তিত হয় না |
| প্রয়োগের ক্ষেত্র | একক গ্রুপের জন্য সংক্ষিপ্ত পরিসংখ্যান তৈরি | প্রতিটি রেকর্ডের জন্য বিশ্লেষণমূলক আউটপুট তৈরি |
সারাংশ
Impala তে Data Aggregation এবং Window Functions ডেটার উপর শক্তিশালী বিশ্লেষণ করতে ব্যবহৃত হয়। Aggregation Functions ব্যবহার করে আপনি ডেটার গাণিতিক সংক্ষেপণ যেমন মোট, গড়, সর্বনিম্ন, এবং সর্বোচ্চ মান বের করতে পারেন, যখন Window Functions ডেটাকে উইন্ডো বা গ্রুপে বিভক্ত না করে একক রেকর্ডের ভিত্তিতে গাণিতিক অপারেশন চালাতে সাহায্য করে। Window Functions যেমন ROW_NUMBER(), RANK(), এবং NTILE() ব্যবহার করে আপনি রেকর্ডগুলোর মধ্যে আরো বিস্তারিত বিশ্লেষণ এবং র্যাঙ্কিং করতে পারেন। এই দুটি কৌশল ব্যবহার করে Impala তে দ্রুত এবং কার্যকরী ডেটা বিশ্লেষণ সম্ভব।
Apache Impala তে Aggregation Functions ব্যবহার করা হয় ডেটার ওপর বিভিন্ন গণনা বা সারাংশ তৈরি করতে। এই ফাংশনগুলো ডেটাসেটের একটি বা একাধিক কলামের ওপর কাজ করে এবং সাধারণত একটি আউটপুট রিটার্ন করে, যা সাধারণত সংখ্যাসূচক মান হয়। Aggregation Functions মূলত ডেটা বিশ্লেষণের জন্য ব্যবহৃত হয়, যেমন মোট যোগফল, গড়, গণনা ইত্যাদি।
এখানে Impala তে ব্যবহৃত কিছু গুরুত্বপূর্ণ Aggregation Functions আলোচনা করা হলো।
১. SUM()
SUM() ফাংশনটি একটি নির্দিষ্ট কলামের সব মানের যোগফল বের করে। এটি সাধারণত সংখ্যাসূচক ডেটার জন্য ব্যবহৃত হয়।
উদাহরণ:
SELECT SUM(sales_amount) AS total_sales
FROM sales;
এটি sales টেবিলের sales_amount কলামের সব মান যোগফল করবে এবং total_sales নামক আউটপুট রিটার্ন করবে।
২. AVG()
AVG() ফাংশনটি একটি নির্দিষ্ট কলামের গড় মান বের করে। এটি সাধারণত সংখ্যাসূচক ডেটা যেমন বয়স, মূল্য, পরিমাণ ইত্যাদি গণনা করতে ব্যবহৃত হয়।
উদাহরণ:
SELECT AVG(age) AS average_age
FROM employees;
এটি employees টেবিলের age কলামের গড় বয়স বের করবে এবং average_age আউটপুট রিটার্ন করবে।
৩. COUNT()
COUNT() ফাংশনটি একটি কলামের (বা সব রেকর্ডের) সংখ্যার হিসাব করে। এটি সাধারণত ডেটাসেটে কয়টি রেকর্ড বা নির্দিষ্ট মান আছে তা জানার জন্য ব্যবহৃত হয়।
উদাহরণ:
SELECT COUNT(*) AS total_employees
FROM employees;
এটি employees টেবিলের মোট রেকর্ড বা কর্মচারীর সংখ্যা বের করবে।
একটি নির্দিষ্ট কলামের মান গোনা:
SELECT COUNT(department_id) AS department_count
FROM employees;
এটি department_id কলামের মোট রেকর্ডের সংখ্যা বের করবে।
৪. MIN()
MIN() ফাংশনটি একটি কলামের সর্বনিম্ন মান বের করে। এটি সাধারণত সর্বনিম্ন মূল্য, পরিমাণ বা অন্য যে কোনো সংখ্যাসূচক মান বের করতে ব্যবহৃত হয়।
উদাহরণ:
SELECT MIN(salary) AS lowest_salary
FROM employees;
এটি employees টেবিলের salary কলামের সর্বনিম্ন বেতন বের করবে এবং lowest_salary আউটপুট হিসেবে দেখাবে।
৫. MAX()
MAX() ফাংশনটি একটি কলামের সর্বোচ্চ মান বের করে। এটি সাধারণত সর্বোচ্চ মূল্য, পরিমাণ বা অন্য কোনো সংখ্যাসূচক মান বের করতে ব্যবহৃত হয়।
উদাহরণ:
SELECT MAX(salary) AS highest_salary
FROM employees;
এটি employees টেবিলের salary কলামের সর্বোচ্চ বেতন বের করবে এবং highest_salary আউটপুট হিসেবে দেখাবে।
৬. GROUP_CONCAT()
GROUP_CONCAT() ফাংশনটি একটি কলামের মানগুলোকে একত্রিত করে একটি স্ট্রিং আকারে রিটার্ন করে। এটি বিশেষভাবে ব্যবহার করা হয় যখন একাধিক মান একত্রে দেখানোর প্রয়োজন হয়।
উদাহরণ:
SELECT department_id, GROUP_CONCAT(employee_name) AS employee_names
FROM employees
GROUP BY department_id;
এটি employees টেবিলের employee_name গুলোর একটি স্ট্রিং তৈরি করবে, যা department_id এর ভিত্তিতে গ্রুপ করা হবে।
৭. STDDEV()
STDDEV() ফাংশনটি একটি কলামের স্ট্যান্ডার্ড ডেভিয়েশন বের করে, যা ডেটার বৈচিত্র্য বা ছড়িয়ে পড়া পরিমাপ করে।
উদাহরণ:
SELECT STDDEV(salary) AS salary_deviation
FROM employees;
এটি employees টেবিলের salary কলামের স্ট্যান্ডার্ড ডেভিয়েশন বের করবে।
৮. VARIANCE()
VARIANCE() ফাংশনটি একটি কলামের ভ্যারিয়েন্স বের করে, যা ডেটার ছড়িয়ে পড়া বা বৈচিত্র্য পরিমাপ করে। এটি স্ট্যান্ডার্ড ডেভিয়েশনের বর্গফল।
উদাহরণ:
SELECT VARIANCE(salary) AS salary_variance
FROM employees;
এটি employees টেবিলের salary কলামের ভ্যারিয়েন্স বের করবে।
৯. COUNT(DISTINCT)
COUNT(DISTINCT) ফাংশনটি একটি কলামের ইউনিক বা আলাদা মানের সংখ্যা বের করে। এটি ডুপ্লিকেট মান বাদ দিয়ে আলাদা মান গণনা করতে ব্যবহৃত হয়।
উদাহরণ:
SELECT COUNT(DISTINCT department_id) AS unique_departments
FROM employees;
এটি employees টেবিলের department_id কলামের ইউনিক বা আলাদা department_id গুলি গণনা করবে।
সারাংশ
Impala তে Aggregation Functions বিভিন্ন ধরনের পরিসংখ্যান বের করতে ব্যবহৃত হয়, যেমন মোট যোগফল (SUM), গড় (AVG), মোট গণনা (COUNT), সর্বনিম্ন মান (MIN), সর্বোচ্চ মান (MAX), এবং আরও অনেক কিছু। এই ফাংশনগুলো ডেটা বিশ্লেষণে অত্যন্ত গুরুত্বপূর্ণ এবং ডেটাবেসের বিভিন্ন কলামের ওপর সারাংশ বা সামগ্রিক পরিসংখ্যান তৈরি করতে সহায়ক। GROUP BY ক্লজ ব্যবহার করে বিভিন্ন গ্রুপে ডেটা বিভক্ত করে এই ফাংশনগুলো প্রয়োগ করা যায়, যা আরও গভীর বিশ্লেষণ করতে সাহায্য করে।
Impala-তে GROUP BY এবং HAVING ক্লজগুলি ডেটা গ্রুপ করার এবং সেই গ্রুপের ওপর শর্ত প্রয়োগ করার জন্য ব্যবহৃত হয়। এগুলো মূলত aggregate functions (যেমন COUNT, SUM, AVG, MAX, MIN) এর সাথে ব্যবহৃত হয়, যা ডেটার ওপর সংক্ষেপিত বা সারাংশ বের করতে সাহায্য করে।
GROUP BY ক্লজ
GROUP BY ক্লজ ব্যবহার করে আপনি একটি নির্দিষ্ট কলামের ভিত্তিতে ডেটাকে গ্রুপ করতে পারেন। এর মাধ্যমে একে একে গ্রুপভিত্তিক ডেটার ওপর বিভিন্ন গণনা করা সম্ভব হয়। যেমন, একটি টেবিলের মধ্যে বিভিন্ন বিভাগ বা তারিখের জন্য মোট বিক্রয় হিসাব করা।
সিনট্যাক্স:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
এখানে:
- column1: যে কলামের উপর গ্রুপিং করতে চান।
- aggregate_function(column2): যে কলামের উপর গণনা করতে চান (যেমন SUM, COUNT, AVG ইত্যাদি)।
- table_name: টেবিলের নাম।
উদাহরণ:
ধরা যাক, আমাদের কাছে একটি sales টেবিল আছে, যেখানে বিক্রয় ডেটা রয়েছে। আমরা প্রতিটি বিভাগের মোট বিক্রয় পরিমাণ বের করতে চাই:
SELECT department, SUM(amount)
FROM sales
GROUP BY department;
এখানে, department কলামের ভিত্তিতে ডেটা গ্রুপ করা হয়েছে এবং প্রতিটি বিভাগের মোট বিক্রয় (amount) যোগ করা হয়েছে।
HAVING ক্লজ
HAVING ক্লজ সাধারণত GROUP BY এর সাথে ব্যবহৃত হয়, যেখানে গ্রুপের ওপর শর্ত প্রয়োগ করা হয়। WHERE ক্লজ সাধারণত রেকর্ডের উপর শর্ত দেয়, কিন্তু HAVING গ্রুপের ওপর শর্ত প্রয়োগ করে।
সিনট্যাক্স:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING aggregate_function(column2) condition;
এখানে:
- aggregate_function(column2): যে কলামে অ্যাগ্রিগেট ফাংশন ব্যবহার করছেন (যেমন SUM, COUNT, AVG)।
- condition: যেটি শর্ত হিসাবে ব্যবহার করা হবে (যেমন >, <, =, >= ইত্যাদি)।
উদাহরণ:
ধরা যাক, আমরা আগের sales টেবিল থেকে শুধুমাত্র সেই বিভাগের তথ্য দেখতে চাই যেখানে বিক্রয়ের মোট পরিমাণ ১০,০০০-এর বেশি:
SELECT department, SUM(amount)
FROM sales
GROUP BY department
HAVING SUM(amount) > 10000;
এখানে, GROUP BY প্রথমে department অনুযায়ী ডেটা গ্রুপ করেছে এবং তারপর HAVING শর্ত প্রয়োগ করেছে, যেখানে মোট বিক্রয় ১০,০০০-এর বেশি হতে হবে।
GROUP BY এবং HAVING এর মধ্যে পার্থক্য
- GROUP BY: এটি ডেটাকে গ্রুপ করে, যা আপনাকে একটি নির্দিষ্ট কলাম বা ফিল্ড অনুযায়ী ডেটা সাজাতে সহায়তা করে। এটি ডেটার মধ্যে গ্রুপিং করার জন্য ব্যবহৃত হয় এবং সাধারণত aggregate functions এর সাথে ব্যবহৃত হয়।
- HAVING: এটি GROUP BY এর পর আসে এবং গ্রুপগুলোর ওপর শর্ত প্রয়োগ করতে ব্যবহৃত হয়। WHERE ক্লজ সাধারণত raw ডেটার ওপর কাজ করে, তবে HAVING গ্রুপ করা ডেটার উপর শর্ত দেয়।
GROUP BY এবং HAVING এর ব্যবহারিক উদাহরণ
উদাহরণ ১: গ্রুপিং এবং COUNT ব্যবহার
ধরা যাক, আমরা একটি employees টেবিল থেকে প্রতিটি বিভাগের মোট কর্মচারী সংখ্যা জানতে চাই:
SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department;
এখানে, আমরা department কলামের ভিত্তিতে গ্রুপ করেছি এবং প্রতিটি বিভাগের কর্মচারীর সংখ্যা গণনা করেছি।
উদাহরণ ২: HAVING শর্ত ব্যবহার
এবার, আমরা শুধু সেই বিভাগের কর্মচারী সংখ্যা দেখতে চাই যেখানে মোট কর্মচারী ৫০ জনের বেশি:
SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department
HAVING COUNT(*) > 50;
এখানে, HAVING COUNT(*) > 50 শর্তটি ব্যবহার করা হয়েছে, যার মাধ্যমে শুধুমাত্র সেই সব বিভাগ প্রদর্শিত হবে যেখানে কর্মচারীর সংখ্যা ৫০-এর বেশি।
সারাংশ
GROUP BY এবং HAVING ক্লজ Impala তে খুবই কার্যকরী। GROUP BY ডেটাকে একটি নির্দিষ্ট কলাম বা ক্ষেত্রের ভিত্তিতে গ্রুপ করে এবং HAVING সেই গ্রুপের ওপর শর্ত প্রয়োগ করে। এই দুটি ক্লজ একত্রে ডেটা বিশ্লেষণে সহায়তা করে, যেমন অ্যাগ্রিগেট ফাংশন (SUM, COUNT, AVG) ব্যবহার করে ডেটার সারাংশ বের করা এবং সেই সারাংশের ওপর শর্ত প্রয়োগ করা।
Apache Impala একটি শক্তিশালী ডেটাবেস ইঞ্জিন যা SQL এর মাধ্যমে ডিস্ট্রিবিউটেড ডেটা প্রসেসিং সম্পাদন করতে সক্ষম। Window Functions Impala তে অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলো ব্যবহার করে আপনি ডেটার উপর একটি উইন্ডো তৈরি করতে পারেন, যার মধ্যে বিভিন্ন রেকর্ডের উপর নির্ভর করে গণনা (calculation) বা বিশ্লেষণ করা যায়। এগুলো সাধারণত Aggregation Functions (যেমন SUM, AVG, COUNT) এর মতোই কাজ করে, কিন্তু তারা সারির একটির পরিবর্তে পুরো ডেটাসেটের উপর কাজ করে এবং বিভিন্ন সারণির মধ্যে সংযুক্তি বা সম্পর্ক তৈরি করতে সাহায্য করে।
Window Functions এর মৌলিক ধারণা
Window Functions সাধারণত একটি উইন্ডো বা স্লাইডিং উইন্ডো এর মধ্যে গণনা করতে ব্যবহৃত হয়। এখানে একটি উইন্ডো বলতে সাধারণত একাধিক রেকর্ডের একটি গ্রুপ বুঝানো হয়, যা কিছু নির্দিষ্ট শর্তের ভিত্তিতে তৈরি হয়। একটি উইন্ডো তৈরি করার সময় আপনি বিভিন্ন রেকর্ডের উপর ফাংশন প্রয়োগ করতে পারেন, যেমন প্রতিটি রেকর্ডের উপর রানিং টোটাল বা পরবর্তী বা পূর্ববর্তী রেকর্ডের মানের সাথে সম্পর্কিত কোনো গণনা।
Window Functions এর ধরন
Impala তে কয়েকটি গুরুত্বপূর্ণ Window Functions রয়েছে, যা বিভিন্ন ধরনের বিশ্লেষণ বা গণনা করতে ব্যবহৃত হয়। এখানে কিছু সাধারণ এবং জনপ্রিয় Window Functions এর আলোচনা করা হলো:
১. ROW_NUMBER()
ROW_NUMBER() ফাংশন প্রতিটি রেকর্ডের জন্য একটি অনন্য সংখ্যা (row number) প্রদান করে, যা নির্দিষ্ট এক্সপ্রেশনের ভিত্তিতে সাজানো হয়।
উদাহরণ:
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
এখানে, salary অনুসারে কর্মচারীদের একটি সজ্জিত তালিকা তৈরি করা হয়েছে, এবং প্রতিটি কর্মচারীকে একটি নির্দিষ্ট row_num দেওয়া হয়েছে।
২. RANK()
RANK() ফাংশনটি প্রতিটি রেকর্ডের জন্য একটি র্যাঙ্ক বা অবস্থান প্রদান করে, তবে যদি দুটি রেকর্ডের মান একে অপরের সমান হয়, তাহলে তাদের জন্য একই র্যাঙ্ক হবে এবং পরবর্তী র্যাঙ্কটি একাধিক বাড়ানো হবে।
উদাহরণ:
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
এখানে, কর্মচারীদের র্যাঙ্ক দেওয়া হচ্ছে, এবং যদি দুইটি কর্মচারীর salary সমান থাকে, তারা একই র্যাঙ্ক পাবে এবং পরবর্তী র্যাঙ্কে একটি লাফ দেওয়া হবে।
৩. DENSE_RANK()
DENSE_RANK() ফাংশনটি RANK() এর মতো কাজ করে, তবে এটি পরবর্তী র্যাঙ্কে কোনো লাফ দেয় না। অর্থাৎ, যদি দুটি রেকর্ড সমান র্যাঙ্ক পায়, তবে পরবর্তী র্যাঙ্কটি একই ক্রমে থাকে।
উদাহরণ:
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
এখানে, DENSE_RANK() ব্যবহার করা হয়েছে, যার মাধ্যমে salary অনুযায়ী র্যাঙ্ক দেওয়া হবে এবং কোনো লাফ হবে না।
৪. NTILE()
NTILE() ফাংশনটি একটি সংখ্যা প্রদান করে, যা ডেটাকে N ভাগে বিভক্ত করে। এটি বিশেষ করে যখন আপনি ডেটাকে একটি নির্দিষ্ট ভাগে বিভক্ত করতে চান তখন ব্যবহৃত হয়।
উদাহরণ:
SELECT name, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;
এখানে, কর্মচারীদের salary অনুযায়ী তাদেরকে ৪টি সমান ভাগে বিভক্ত করা হচ্ছে, এবং প্রতিটি কর্মচারীকে একটি quartile দেওয়া হচ্ছে।
৫. LEAD() এবং LAG()
LEAD() এবং LAG() ফাংশন দুটি একই ধরনের কাজ করে, তবে একে অপরের বিপরীত। LEAD() বর্তমান রেকর্ডের পরবর্তী রেকর্ডের মান প্রদান করে এবং LAG() বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান প্রদান করে।
LEAD() উদাহরণ:
SELECT name, salary,
LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary
FROM employees;
এটি কর্মচারীদের বর্তমান salary এবং পরবর্তী salary প্রদর্শন করবে।
LAG() উদাহরণ:
SELECT name, salary,
LAG(salary, 1) OVER (ORDER BY salary) AS previous_salary
FROM employees;
এটি কর্মচারীদের বর্তমান salary এবং পূর্ববর্তী salary প্রদর্শন করবে।
৬. SUM() / AVG() with Windowing
SUM() এবং AVG() এর মতো অ্যাগ্রিগেট ফাংশনগুলিকে উইন্ডো ফাংশনের সঙ্গে ব্যবহার করলে আপনি চলমান মোট বা গড় হিসাব করতে পারেন, যা রানিং টোটাল বা গড় হিসাবের জন্য অত্যন্ত উপকারী।
উদাহরণ:
SELECT name, salary,
SUM(salary) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total
FROM employees;
এটি কর্মচারীদের salary এর রানিং টোটাল প্রদান করবে, যেখানে প্রতিটি রেকর্ডের জন্য তার পূর্ববর্তী সমস্ত রেকর্ডের মোট যোগ হবে।
Window Functions এর সুবিধা
- অ্যাগ্রিগেশন ছাড়া ডেটার বিশ্লেষণ: Window Functions এর মাধ্যমে আপনি অ্যাগ্রিগেট ফাংশন ছাড়াও ডেটা বিশ্লেষণ করতে পারেন, যেমন রানিং টোটাল, পার্থক্য ইত্যাদি।
- কাস্টমাইজড গ্রুপিং: সাধারণ গ্রুপিং বা অ্যাগ্রিগেশন ছাড়াও আপনি কাস্টমাইজড উইন্ডো তৈরি করতে পারেন, যা আপনার প্রয়োজন অনুযায়ী বিশ্লেষণ করবে।
- ফাংশন ব্যবহারের সহজতা: SQL-এ সহজভাবে window functions ব্যবহার করে আপনি দ্রুত এবং কার্যকরী বিশ্লেষণ পরিচালনা করতে পারেন।
সারাংশ
Window Functions Impala তে ডেটার মধ্যে বিভিন্ন ধরনের বিশ্লেষণ করতে অত্যন্ত উপকারী। এগুলো বিশেষ করে রানিং টোটাল, র্যাঙ্কিং, বা ডেটার পরবর্তী/পূর্ববর্তী মানের সাথে সম্পর্কিত বিশ্লেষণের জন্য ব্যবহৃত হয়। ROW_NUMBER(), RANK(), LEAD(), LAG() এর মতো ফাংশনগুলো ডেটাকে আরো বিস্তৃতভাবে বিশ্লেষণ করতে সাহায্য করে এবং SUM(), AVG() সহ অন্যান্য অ্যাগ্রিগেট ফাংশনগুলো উইন্ডো ফাংশন হিসেবে ব্যবহার করা যায়, যা ডেটার সাথে আরও কার্যকরী বিশ্লেষণ করতে সহায়ক।
Apache Impala একটি শক্তিশালী SQL ইঞ্জিন যা বড় ডেটা সেটে দ্রুত কোয়েরি এবং বিশ্লেষণ করতে সক্ষম। Impala বিভিন্ন window functions প্রদান করে, যা ডেটা বিশ্লেষণকে আরও শক্তিশালী এবং সহজতর করে তোলে। এর মধ্যে কিছু গুরুত্বপূর্ণ ফাংশন হল CUME_DIST, NTILE, LAG, এবং LEAD। এই ফাংশনগুলো সাধারণত অর্ডার্ড ডেটা এর মধ্যে বিশ্লেষণ করতে ব্যবহৃত হয় এবং বিভিন্ন স্ট্যাটিস্টিক্যাল বা র্যাংকিং অপারেশনগুলোতে সহায়ক।
CUME_DIST Function
CUME_DIST (Cumulative Distribution) একটি window function যা নির্দিষ্ট একটি রেকর্ডের প্রতি শতকরা ভাগ (percentage) প্রদান করে, যা তার পূর্ববর্তী রেকর্ডগুলোর সাথে মিলিয়ে হয়। এটি মূলত রেকর্ডের পরিমাণের তুলনায় তার অবস্থান বা কিউমুলেটিভ ডিস্ট্রিবিউশন পরিমাপ করতে ব্যবহৃত হয়।
সিঙ্কট্যাক্স:
CUME_DIST() OVER (PARTITION BY column_name ORDER BY column_name)
- PARTITION BY: ডেটাকে বিভাগে ভাগ করার জন্য ব্যবহৃত হয় (যদি প্রয়োজন হয়)।
- ORDER BY: ডেটা কীভাবে সাজানো হবে তা নির্ধারণ করে।
উদাহরণ:
SELECT employee_id, salary,
CUME_DIST() OVER (ORDER BY salary) AS cumulative_dist
FROM employees;
এখানে, CUME_DIST ফাংশনটি প্রত্যেক কর্মচারীর salary অনুযায়ী তার কিউমুলেটিভ ডিস্ট্রিবিউশন হিসাব করবে। অর্থাৎ, কোন কর্মচারী তার salary এর মধ্যে কোথায় অবস্থান করছে, তার শতকরা অংশ দেখাবে।
NTILE Function
NTILE ফাংশনটি ডেটাকে n সংখ্যক গ্রুপে (tiles) বিভক্ত করে। এটি সাধারণত ডেটা সেটকে সমান ভাগে বিভক্ত করার জন্য ব্যবহৃত হয়, যেমন টপ 10%, 20% ইত্যাদি।
সিঙ্কট্যাক্স:
NTILE(n) OVER (PARTITION BY column_name ORDER BY column_name)
- n: ভাগের সংখ্যা (যেমন, 4টি ভাগের জন্য 4 ব্যবহার করা হবে)।
- PARTITION BY: ডেটাকে ভাগ করার জন্য ব্যবহৃত কলাম (যদি প্রয়োজন হয়)।
- ORDER BY: ডেটাকে সাজানোর জন্য ব্যবহৃত কলাম।
উদাহরণ:
SELECT employee_id, salary,
NTILE(4) OVER (ORDER BY salary) AS quartile
FROM employees;
এখানে, NTILE(4) ফাংশনটি salary অনুসারে ডেটাকে ৪টি ভাগে (quartiles) ভাগ করবে, এবং প্রতিটি কর্মচারীকে তার বর্গ অনুযায়ী শ্রেণীবদ্ধ করবে।
LAG Function
LAG ফাংশনটি পূর্ববর্তী রেকর্ডের মান প্রদান করে, যা মূলত window function এর মধ্যে ব্যবহার করা হয়। এটি চলমান রেকর্ডের পূর্ববর্তী মান নিয়ে কাজ করতে সাহায্য করে।
সিঙ্কট্যাক্স:
LAG(column_name, offset, default_value) OVER (PARTITION BY column_name ORDER BY column_name)
- column_name: যে কলামের মান আপনি ব্যবহার করতে চান।
- offset: পূর্ববর্তী রেকর্ডের সংখ্যা (যেমন, 1 মানে এক রেকর্ড পিছনে যাবে)।
- default_value: যদি পূর্ববর্তী রেকর্ড না পাওয়া যায়, তবে ডিফল্ট মান কী হবে (এটি ঐচ্ছিক)।
উদাহরণ:
SELECT employee_id, salary,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_salary
FROM employees;
এখানে, LAG ফাংশনটি প্রতিটি কর্মচারীর salary এর পূর্ববর্তী মান প্রদান করবে (যদি কোনো পূর্ববর্তী রেকর্ড থাকে), এবং hire_date অনুসারে সাজানো হবে। যদি পূর্ববর্তী রেকর্ড না থাকে, তবে ডিফল্ট মান 0 প্রদান করা হবে।
LEAD Function
LEAD ফাংশনটি LAG ফাংশনের বিপরীত, যেখানে এটি পরবর্তী রেকর্ডের মান প্রদান করে। এটি চলমান রেকর্ডের পরবর্তী মান নিয়ে কাজ করতে সহায়তা করে।
সিঙ্কট্যাক্স:
LEAD(column_name, offset, default_value) OVER (PARTITION BY column_name ORDER BY column_name)
- column_name: যে কলামের মান আপনি ব্যবহার করতে চান।
- offset: পরবর্তী রেকর্ডের সংখ্যা (যেমন, 1 মানে এক রেকর্ড পরে যাবে)।
- default_value: যদি পরবর্তী রেকর্ড না পাওয়া যায়, তবে ডিফল্ট মান কী হবে (এটি ঐচ্ছিক)।
উদাহরণ:
SELECT employee_id, salary,
LEAD(salary, 1, 0) OVER (ORDER BY hire_date) AS next_salary
FROM employees;
এখানে, LEAD ফাংশনটি প্রতিটি কর্মচারীর salary এর পরবর্তী মান প্রদান করবে (যদি কোনো পরবর্তী রেকর্ড থাকে), এবং hire_date অনুসারে সাজানো হবে। যদি পরবর্তী রেকর্ড না থাকে, তবে ডিফল্ট মান 0 প্রদান করা হবে।
সারাংশ
CUME_DIST, NTILE, LAG, এবং LEAD ফাংশনগুলো window functions হিসেবে ডেটা বিশ্লেষণে খুবই সহায়ক। এগুলি ব্যবহারকারীদের রেকর্ডগুলির মধ্যে সম্পর্ক, কিউমুলেটিভ ডিস্ট্রিবিউশন, বা পূর্ববর্তী এবং পরবর্তী রেকর্ডের মান নির্ধারণে সহায়তা করে। এগুলো Impala SQL তে ডেটা বিশ্লেষণের বিভিন্ন প্রয়োজনীয় পরিস্থিতিতে ব্যবহার করা যেতে পারে, যেমন:
- CUME_DIST: কিউমুলেটিভ ডিসট্রিবিউশন পরিমাপের জন্য।
- NTILE: ডেটাকে সমান ভাগে বিভক্ত করার জন্য।
- LAG এবং LEAD: পূর্ববর্তী এবং পরবর্তী মান নির্ধারণের জন্য।
এই ফাংশনগুলো ডেটা সেট বিশ্লেষণের ক্ষেত্রে আরও কার্যকরী এবং কার্যকর পদ্ধতি প্রদান করে।
Read more